package com.rank.list.service;

import io.lettuce.core.Limit;
import io.lettuce.core.Range;
import java.util.Set;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;

/**
 * @author John Doe Tang
 * @date 2021年06月26日 20:27
 */
public interface RankListService<K, V> {

  /**
   * 单个新增or更新
   *
   * @param key
   * @param value
   * @param score
   * @return java.lang.Boolean
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:51
   */
  Boolean add(K key, V value, double score);

  /**
   * 批量新增or更新
   *
   * @param key
   * @param tuples
   * @return java.lang.Long
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Long add(K key, Set<TypedTuple<V>> tuples);

  /**
   * 使用加法操作分数
   *
   * @param key
   * @param value
   * @param delta
   * @return java.lang.Double
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Double incrementScore(K key, V value, double delta);

  /**
   * 通过key/value删除
   *
   * @param key
   * @param values
   * @return java.lang.Long
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Long remove(K key, Object... values);

  /**
   * 通过排名区间删除
   *
   * @param key
   * @param start
   * @param end
   * @return java.lang.Long
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Long removeRange(K key, long start, long end);

  /**
   * 通过分数区间删除
   *
   * @param key
   * @param min
   * @param max
   * @return java.lang.Long
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Long removeRangeByScore(K key, double min, double max);

  /**
   * @param key
   * @param start
   * @param end
   * @return java.util.Set<V>
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:53
   */
  Set<V> range(K key, long start, long end);

  /**
   * 通过排名区间获取列表值和分数集合
   *
   * @param key
   * @param start
   * @param end
   * @return java.util.Set<org.springframework.data.redis.core.ZSetOperations.TypedTuple < V>>
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Set<TypedTuple<V>> rangeWithScores(K key, long start, long end);

  /**
   * 通过分数区间获取列表值集合
   *
   * @param key
   * @param min
   * @param max
   * @return java.util.Set<V>
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Set<V> rangeByScore(K key, double min, double max);

  /**
   * 通过分数区间获取列表值和分数集合
   *
   * @param key
   * @param min
   * @param max
   * @return java.util.Set<org.springframework.data.redis.core.ZSetOperations.TypedTuple < V>>
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Set<TypedTuple<V>> rangeByScoreWithScores(K key, double min, double max);

  /**
   * 通过Range对象删选再获取集合排行
   *
   * @param key
   * @param range
   * @return java.util.Set<V>
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Set<V> rangeByLex(K key, Range range);

  /**
   * 通过Range对象删选再获取limit数量的集合排行
   *
   * @param key
   * @param range
   * @param limit
   * @return java.util.Set<V>
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Set<V> rangeByLex(K key, Range range, Limit limit);

  /**
   * 获取个人排行
   *
   * @param key
   * @param o
   * @return java.lang.Long
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:52
   */
  Long rank(K key, Object o);

  /**
   * 获取个人分数
   *
   * @param key
   * @param o
   * @return java.lang.Double
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:53
   */
  Double score(K key, Object o);

  /**
   * 统计分数区间的人数
   *
   * @param key
   * @param min
   * @param max
   * @return java.lang.Long
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:53
   */
  Long count(K key, double min, double max);

  /**
   * 统计集合基数
   *
   * @param key
   * @return java.lang.Long
   * @author John Doe Tang
   * @date 2021/6/26 0026 20:53
   */
  Long zCard(K key);
}
